const { channel } = require('diagnostics_channel')
const { contextBridge, ipcRenderer } = require('electron')
const Path = require('path')
const windows = require('./windows');
const fs = require("fs")

const bridge = {

  node_verison: () => process.versions.node,
  chrome_verison: () => process.versions.chrome,
  electron_verison: () => process.versions.electron,
  cwd: () => process.cwd(),  //exe运行目录
  root: () => {//程序根目录
    console.log("root()")
    return Path.join(process.cwd(), "../")
  },


  /** 
   * 封装ipcRender指令 
   * */

  //发送npk指令
  //channel 对应 npk.init.js中 Npk中封装的接口
  //...data 即接口参数
  //token 多任务时的标记
  npkSend: (channel, token, ...data) => ipcRenderer.send("npk-event", channel, token, ...data),

  //监听npk回复
  //fn: function(token,channel,err,data) 
  //通常只需要注册一次，在回调函数中根据chnnel分发处理函数
  npkReply: (fn) => ipcRenderer.on("npk-reply", fn),

  //发送pvf-pack指令
  pvfSend: (channel, token, ...data) => ipcRenderer.send("pvf-pack", channel, token, ...data),

  //监听pvf-pack回复
  pvfReply: (fn) => ipcRenderer.on("pvf-pack-reply", fn),

  //选择文件对话框
  //系统级弹窗
  openFileDialog: (title, properties, filters) => ipcRenderer.invoke("open-file-dialog", title, properties, filters),

  //打开文件资源管理器窗口
  openExplorer: (filePath) => ipcRenderer.send("open-explorer", filePath),

  //用系统浏览器打开url
  openBrowerUrl: (url) => ipcRenderer.send("open-brower-url", url),


  //Buffer
  buffer: () => ({
    from: Buffer.from,
    alloc: Buffer.alloc,
    allocUnsafe: Buffer.allocUnsafe,
    isBuffer: Buffer.isBuffer,
    compare: Buffer.compare,
    concat: Buffer.concat,
  }),

  /** 
   * ipcRender指令  
   * 
   * 尽量不要用，应该使用封装好的接口  
   */

  //渲染进程向主进程发送指令
  //尽量不要用这个函数，使用下面封装好的接口
  ipcRenderSend: (channel, ...data) => ipcRenderer.send(channel, ...data),

  //发送同步指令
  ipcRenderInvoke: (channel, ...data) => ipcRenderer.invoke(channel, ...data),

  //监听后台指令
  ipcRenderOn: (channel, fn) => ipcRenderer.on(channel, fn),



  /** 
   * 本地监听服务 
   * */

  //开启本地监听服务
  openListenServer: () => ipcRenderer.send("open-http-server"),

  //重启本地监听服务
  restartListenServer: () => ipcRenderer.send("restart-http-server"),

  //本地监听服务-添加过滤器
  addListenServerFilter: (fn) => ipcRenderer.send("http-server-addfilter", fn),

  //本地监听服务-添加监听器
  addListenServerListener: (uri, fn) => ipcRenderer.send("http-server-addlistener", uri, fn),

  //本地监听服务-获取过滤器列表
  getListenServerFilters: (fn) => ipcRenderer.invoke("http-server-getfilter", fn),

  //本地监听服务-获取监听器列表
  getListenServerListeners: (fn) => ipcRenderer.invoke("http-server-getlistener", fn),

}

//加入nodejs库
const nodeLibs = ['os', 'fs', 'path', 'http', 'https', 'url', 'util', 'net', 'crypto', 'dns', 'querystring', 'zlib']
nodeLibs.forEach(node => {
  bridge[node] = function () {
    return require(node);
  }
})

//加入自定义插件
const render = windows.getPlugins("render");
render.forEach(r => {
  console.warn("桥接一个render插件", r.key, r.path)
  bridge[r.key] = function () {
    return require(r.path);
  }
})

//通过注入函数，使页面可以获取nodejs环境
//注意，不能注入依赖electron环境的js文件。 主渲交互应该使用ipcMain和ipcRender
contextBridge.exposeInMainWorld('electron', bridge)
